#include <stdio.h>
#include <stdarg.h>
#include "std.h"

int getint()
{
    int d;

    scanf("%d", &d);

    return d;
}

int getch()
{
    char d;

    scanf("%c", &d);

    return d;
}

int getarray(int a[])
{
    int n, i;

    // 获取元素个数
    scanf("%d", &n);

    // 获取元素内容
    for (i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }

    return n;
}

void putint(int k)
{
    printf("%d", k);
}

void putch(int c)
{
    printf("%c", (char)c);
}

void putarray(int n, int *d)
{
    int k;

    // 输出元素个数
    printf("%d:", n);

    // 输出元素内容，空格分割
    for (k = 0; k < n; k++) {
        printf(" %d", d[k]);
    }

    // 输出换行符
    printf("\n");
}

float getfloat()
{
    float n;
    scanf("%a", &n);
    return n;
}

int getfarray(float a[])
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%a", &a[i]);
    }
    return n;
}

void putfloat(float a)
{
    printf("%a", a);
}

void putfarray(int n, float a[])
{
    printf("%d:", n);
    for (int i = 0; i < n; i++) {
        printf(" %a", a[i]);
    }
    printf("\n");
}

void putf(char a[], ...)
{
    va_list args;
    va_start(args, a);
    vfprintf(stdout, a, args);
    va_end(args);
}


/* Timing function implementation */

__attribute((constructor)) void before_main()
{
    for (int i = 0;i < _SYSY_N;i++) {
        _sysy_h[i] = _sysy_m[i] = _sysy_s[i] = _sysy_us[i] = 0;
    }

    _sysy_idx = 1;
}

__attribute((destructor)) void after_main()
{
    for (int i = 1;i < _sysy_idx;i++) {
        fprintf(stderr, "Timer@%04d-%04d: %dH-%dM-%dS-%dus\n", \
          _sysy_l1[i], _sysy_l2[i], _sysy_h[i], _sysy_m[i], _sysy_s[i], _sysy_us[i]);
        _sysy_us[0] += _sysy_us[i];
        _sysy_s[0] += _sysy_s[i]; _sysy_us[0] %= 1000000;
        _sysy_m[0] += _sysy_m[i]; _sysy_s[0] %= 60;
        _sysy_h[0] += _sysy_h[i]; _sysy_m[0] %= 60;
    }

    // 大于1则输出，否则没有必要输出
    if (_sysy_idx > 1) {
        fprintf(stderr, "TOTAL: %dH-%dM-%dS-%dus\n", _sysy_h[0], _sysy_m[0], _sysy_s[0], _sysy_us[0]);
    }
}

void _sysy_starttime(int lineno)
{
    _sysy_l1[_sysy_idx] = lineno;
    gettimeofday(&_sysy_start, NULL);
}

void _sysy_stoptime(int lineno)
{
    gettimeofday(&_sysy_end, NULL);
    _sysy_l2[_sysy_idx] = lineno;
    _sysy_us[_sysy_idx] += 1000000 * (_sysy_end.tv_sec - _sysy_start.tv_sec) + _sysy_end.tv_usec - _sysy_start.tv_usec;
    _sysy_s[_sysy_idx] += _sysy_us[_sysy_idx] / 1000000; _sysy_us[_sysy_idx] %= 1000000;
    _sysy_m[_sysy_idx] += _sysy_s[_sysy_idx] / 60; _sysy_s[_sysy_idx] %= 60;
    _sysy_h[_sysy_idx] += _sysy_m[_sysy_idx] / 60; _sysy_m[_sysy_idx] %= 60;
    _sysy_idx++;
}
